package com.qtrue.thread;
/*
    Thread类中常用的方法：
         1. start()：启动当前线程，调用当前线程的run()方法。
         2. run()：通常需要重写Thread类中的此方法，将创建的线程要执行的操作声明在此方法中。
         3. currentThread()：返回当前执行代码的线程（Thread类）。
         4. getName()：获取当前线程的名称。
         5. setName()：设置当前线程的名称（最好在调用线程之前设置）。
         6. yield()：释放当前CUP的执行权。
         7. join()：在线程A调用线程B的join()，线程A抢占CPU，此时线程A进入阻塞状态，直到线程B完全执行完以后，
                    线程A才结束阻塞状态。
         8. stop()：强制结束当前线程（不推荐使用）。
         9. sleep(long)：使当前线程睡眠，在指定的时间内，当前线程属于阻塞状态。【单位：毫秒】
         10. isAlive()：判断当前线程是否存活，返回布尔类型。

    线程的优先级（需要在线程调用之前设置）：
        MAX_PRIORITY：10
        MIN_PRIORITY：1
        NORM_PRIORITY：5 （默认的优先级）
    如何获得当前线程的优先级：
        getPriority(int)：获取线程的优先级。
        setPriority(int)：设置线程的优先级。
    说明：
        高优先级的线程要抢占低优先级线程CPU的执行权，但是至少从概率上来讲，高优先级的线程"有可能"优先执行，
        但并不意味着一定高优先级线程执行完以后，低优先级的线程才执行，
        线程抢优先级是为了确保线程下次执行不需要等很久甚至最后才执行。
*/
public class ThreadMethodTest {
    public static void main(String[] args) {
        MyThread03 m3 = new MyThread03("线程一");

//        m3.setName("线程一"); // 通过setName()设置线程名称

        // 设置线程优先级
        m3.setPriority(Thread.MAX_PRIORITY); // 此次嗲用Thread类内设置的默认常量作为当前线程优先级（可以写int类型的值：1-10）

        m3.start(); // 启动线程

        // 给主线程命名
        Thread.currentThread().setName("主线程main");
        // 设置主线程优先级
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
        // 主线程main的操作
        for (int i = 0;i < 100;i++) { // 求出100以内所有的级奇数
            if(i % 2 != 0) {
                // getPriority()：获取当前线程优先级
                System.out.println(Thread.currentThread().getName() + "：" + Thread.currentThread().getPriority() + "：" + i);
            }

//            if(i == 20) {
//                try {
//                    /*
//                        join()：在线程A调用线程B的join()，线程A抢占CPU,此时线程A进入阻塞状态，
//                        直到线程B完全执行完以后，线程A才结束阻塞状态。
//                    */
//                    m3.join();
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }
        }

        // isAlive()：判断当前线程是否存活，返回布尔类型。
        System.out.println(m3.isAlive());
    }
}

class MyThread03 extends Thread {
    @Override
    public void run() {
        for (int i = 0;i < 100;i++) { // 求出100以内所有的偶数
            if(i % 2 == 0) {
//                try {
//                    // sleep():使当前线程睡眠，在指定的时间内，当前线程属于阻塞状态。【单位：毫秒】
//                    Thread.sleep(10);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }

                // getPriority()：获取当前线程优先级
                System.out.println(Thread.currentThread().getName() + "：" + Thread.currentThread().getPriority() + "：" + i);
            }

//            if(i % 20 == 0) {
//                this.yield(); // 释放当前CUP的执行权（少用）
//            }
        }
    }

    // 通过构造器的方式来给线程进行命名（当new当前类的对象时传递实参，然后调用父类的构造器给线程命名）
    public MyThread03(String name) {
        super(name);
    }
}
